/**
@brief module de gestion du terrain
@file terrain.h
@date 2012/06/07
*/

#ifndef __TERRAIN__H
#define __TERRAIN__H


struct bombe;
struct ennemi;
struct chemin;

/**
\struct terrain terrain.h
@brief contient la taille, des tableaux de bombes, de gestion d'ennemis, et de sa forme
*/
struct terrain {
	int tailleX;
	int tailleY;
	char **terrainTab;
	int **dangerTab;
    struct chemin **numCheminTab;
	struct bombe* bombeTab[7];
	struct ennemi* ennemiTab[5];
}; typedef struct terrain terrain;

/**
@brief initialise un terrain
@param[in,out] ter pointeur sur terrain
@param[in] numeroTerrain entier
@param[in] mode entier
@return none
*/
void terrainInit(terrain* ter, const int numeroTerrain, const int mode);

/**
@brief libère la mémoire allouée pour un terrain
@param[in,out] ter pointeur sur terrain
@return none
*/
void terrainLibere(terrain* ter);

/**
@brief verifie que la position x,y est une case accessible
@param[in] ter pointeur sur terrain
@param[in] x entier
@param[in] y entier
@return entier (0 ou 1)
*/
int terrainPositionValide(const terrain* ter, const int x, const int y);

/**
@brief récupere le caractere à la case x,y
@param[in] ter pointeur sur terrain
@param[in] x entier
@param[in] y entier
@return caractere
*/
char terrainGetXY(const terrain* ter, const int x, const int y);

/**
@brief modifie le caractere à la case x,y
@param[in,out] ter pointeur sur terrain
@param[in] x entier
@param[in] y entier
@param[in] objet caractere
@return none
*/
void terrainSetXY(terrain* ter, const int x, const int y, const char objet);

/**
@brief recupere la largeur du terrain
@param[in] pTer pointeur sur terrain
@return entier
*/
const int getTailleX(const terrain *ter);

/**
@brief recupere la hauteur du terrain
@param[in] pTer pointeur sur terrain
@return entier
*/
const int getTailleY(const terrain *ter);

/**
@brief compte le nombre de caisses sur le terrain
@param[in] ter pointeur sur terrain
@return entier
*/
int compteCaisses(const terrain* ter);

/**
@brief initialise un tableau
@param[in,out] dangerTab tableau
@param[in] x entier
@param[in] y entier
@return none
*/
void initDangerTab(int **dangerTab, const int x, const int y);

/**
@brief retourne 1 si la case x,y est une zone danger, 0 sinon
@param[in,out] tab tableau de danger (contient 0 et 1)
@param[in] x entier
@param[in] y entier
@return entier
*/
int estZoneDanger(int** tab, const int x, const int y);

/**
@brief rempli le champs dangerTab du terrain  en fonction des bombes présentes sur le terrain
@param[in,out] ter pointeur sur terrain
@param[in] puissance entier
@return none
*/
void remplirDangerTab(terrain* ter, const int puissance);

#endif
